package cn.rokhdelar.umbrsapi.core.service;


import cn.rokhdelar.umbrsapi.core.dto.PageResult;
import cn.rokhdelar.umbrsapi.core.entity.AbstractEntity;
import cn.rokhdelar.umbrsapi.core.jpa.FilterMap;
import cn.rokhdelar.umbrsapi.core.jpa.nativesql.QueryHelper;
import cn.rokhdelar.umbrsapi.core.jpa.nativesql.UpdateHelper;
import org.springframework.data.domain.Sort;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 
 * @ClassName: BaseService
 * @Description: 
 */
public interface BaseService<T extends AbstractEntity>
{
	/**
	 * 
	 * @Title: doInsertAll
	 * @Description: 批量保存
	 * @param: @param entities
	 * @param: @return
	 * @return: List<T> 
	 * @throws
	 */
	public List<T> doInsertAll(Iterable<T> entities);
	
	/**
	 * 
	 * @Title: doUpdate
	 * @Description: 更新
	 * @param: @param entity
	 * @param: @return
	 * @return: T 
	 * @throws
	 */
	public T doUpdate(T entity);
	
	  /**
     * 批量更新实体对象，采用Btach批量处理机制
     * @param collection
     */
    public List<T> doUpdateAll(final Collection<T> collection);
    
    

	/**
	 * 禁用状态
	 * author:chengyi.liu
	 * @param id
	 * @return
	 * time:2022年3月10日
	 */
	public T doDisabledById(Long id,Integer status);
    
    
    /**
	 * 更新实体 ,为空的属性不更新
	 */
	public T doUpdateSelective(T entity);
	
	 /**
     * 分页查询
     * @param params 放置参数的Map对象，key=参数名，value=参数值
     * @param pageNo 查询页码
     * @param limit 每页限定记录数
     * @return 组装好的Page对象 @see com.cqcis.common.pagination.Page
     */
    public PageResult findByPage(FilterMap filterMap, int pageNo, int limit);
    
    
	
	
    /**
     * 根据条件查询总记录数
     * @param params
     * @return
     * @author wenping
     * @since  2010-12-07
     */
    public PageResult findByPage(FilterMap filterMap, Sort sort,int pageNo, int pageSize);
    
    
    /**
     * 查分页查询
     * @param filterMap 查询条件
     * @param clazz 转换dto
     * @param sort 排序
     * @param pageNo
     * @param pageSize
     * @return
     */
    public PageResult findByPage(FilterMap filterMap,Class<?> clazz, Sort sort,int pageNo, int pageSize);
    
    
	/**
	 * 根据条件查询总的记录数
	 * 
	 * @param params
	 * @return
	 */
	public int findCountByParams(FilterMap filterMap);
	
	
	 /**
     * 创建实体对象
     * @param entity
     * @return TODO
     */
    public T doInsert(T entity)throws Exception;
	
	
    
    /**
     * 选择性批量更新实体对象，采用Btach批量处理机制
     * @author: lilang
     * @param collection
     */
    public List<T> doUpdateAllSelective(final Collection<T> entities);
    
    
    /**
     * 查询全部记录
     * @return 记录集合
     */
    public List<T> findAll() ;
    
	/**
	 * 
	 * @Title: doSave
	 * @Description: 保存实体
	 * @param: @param entity
	 * @param: @return
	 * @return: T 
	 * @throws
	 */
    public T doSave(T entity);
    
    /**
     * 删除实体对象
     * @param entity
     */
    public void doDelete(T entity);
    
    /**
     * 根据主键删除实体对象
     * @param entity
     */
    public void doDeleteByPrimaryKey(Long id);
    
    /**
     * 根据条件删除实体对象
     * @param params
     */
    public void doDeleteByParams(FilterMap filterMap);
    

    /**
     * 根据主键批量删除实体对象，采用Btach批量处理机制
     * @param collection
     */
    public void doDeleteAllByPrimaryKey(final Collection<Long> ids);
    
    /**
     * 逻辑删除实体对象
     * @param entity
     */
    public T doLogicDelete(T entity);
    
    /**
     * 根据主键逻辑删除实体对象
     * @param entity
     */
    public T doLogicDeleteByPrimaryKey(Long id);
    
    /**
     * 根据对象批量逻辑删除
     * <p>Title: doLogicDeleteByEntitys</p>  
     * <p>Description: </p>  
     * @author liucy   
     * @date 2023年12月20日  
     * @param entities
     */
    public void doLogicDeleteByEntitys(final Collection<T> entities);
    /**
     * 根据主键批量逻辑删除实体对象，采用Btach批量处理机制
     * @param collection
     */
    public void doLogicDeleteAllByPrimaryKey(List<Long> ids);
    
    
    /**
     * 根据条件逻辑删除
     * @param params
     * @return
     */
    public void doLogicDeleteByParams(FilterMap filterMap);
    
    
    /**
     * 根据主键返回唯一对象
     * @param sid 序列主键
     * @return 实体对象
     */
    public T findByPrimaryKey(Long id);
    
    /**
     * 根据主键数组返回一批对象
     * @param sids 序列主键数组
     * @return 实体对象链表
     */
    public List<T> findByPrimaryKeys(List ids);
    
    
    /**
     * 根据参数返回一个实体对象，一般用于查询具有唯一约束条件的记录
     * 必须保证传入的参数确实能定位唯一一个对象，否则将iBatis会抛出运行异常
     * @param params 参数Map对象
     * @return 实体对象
     */
    public T findUniqueByParams(FilterMap filterMap);
    
    
    /**
     * 根据参数返回实体对象集合
     * @param params 参数Map对象
     * @return 实体对象链表
     */
    public List<T> findByParams(FilterMap filterMap,Sort sort);
    
    /**
     * 根据参数返回实体对象集合 无需排序
     * <p>Title: findByParams</p>  
     * <p>Description: </p>  
     * @author liucy   
     * @date 2023年4月17日  
     * @param filterMap
     * @return
     */
    public List<T> findByParams(FilterMap filterMap);
    
    
    /**
     * 返回指定数据条数
     * <p>Title: findByParams</p>  
     * <p>Description: </p>  
     * @author liucy   
     * @date 2023年4月17日  
     * @param filterMap
     * @param sort
     * @param limit
     * @return
     */
    public List<T> findByParams(FilterMap filterMap, Sort sort,int limit);

    
    /**
     * 根据条件更新
     * @param params
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
     * @throws Exception
     */
	public void updateByParams(Map<String, Object> params,FilterMap filterMap) throws IllegalArgumentException, IllegalAccessException;
   
    
    /**
     * @Title: findObjectBySql
     * @Description: 通过sql查询obj
     * @param: @param helper
     * @param: @return
     * @return: Object 
     * @throws
     */
	public Object findObjectBySql(QueryHelper helper);
    
    /**
     * 
     * @Title: findListBySql
     * @Description: 通过sql查询list
     * @param: @param helper
     * @param: @return
     * @return: List 
     * @throws
     */
    public List findListBySql(QueryHelper helper);
    
    /**
     * 自定义sql 转对应实体
     * <p>Title: findListBySql</p>  
     * <p>Description: </p>  
     * @author liucy   
     * @date 2023年12月20日  
     * @param helper
     * @param clazz
     * @return
     */
    public List<T> findListBySql(QueryHelper helper,Class<?> clazz);
    
    /**
	 * 
	 * @Title: updateBySqlID
	 * @Description: 描述这个方法的作用
	 * @param: @param helper
	 * @param: @param params
	 * @param: @return
	 * @return: int 
	 * @throws
	 */
	public int updateBySqlId(UpdateHelper helper);
	
	
	/**
	 * 
	 * @Title: createNativePageQuery
	 * @Description: 自定义sql分页查询
	 * @param: @param helper
	 * @param: @param pageNo
	 * @param: @param limit
	 * @param: @return
	 * @return: PageImpl<Map> 
	 * @throws
	 */
	public PageResult selectPageSql(QueryHelper helper, int pageNo, int limit);

	/**
	 * describe: 自定义sql分页查询 需要传入数据dto
	 *
	 * @Author chenJian
	 * @Date 2023/2/10 16:51
	 * @param helper
	 * @param pageNo
	 * @param limit
	 * @param clazz
	 * @return com.crunii.micro.common.dto.PageResult
	 *
	 */
	public PageResult selectPageSql(QueryHelper helper, int pageNo, int limit,Class<?> clazz);
	
	
	/**
	 * 查询listMap集合
	 * author:chengyi.liu
	 * @param filterMap
	 * @param sort
	 * @return
	 * time:2020年11月25日
	 */
	public List<Map<String,Object>> findMapByParams(FilterMap filterMap,Sort sort);
	/**
	 * 追加参数
	 * author:chengyi.liu
	 * @param filterMap
	 * @param params
	 * time:2020年12月9日
	 */
	public void addExtraPageParamters(FilterMap filterMap,Map<String, String> params);
	/**
	 * 对象翻译
	 * author:chengyi.liu
	 * @param entitys
	 * time:2021年3月13日
	 */
	public void translate(List<T> entitys);

	
    
//	/**
//	 * 下载文件
//	 * 
//	 * @param request
//	 * @param response
//	 * @param outFileName
//	 * @param contentType
//	 * @param inputFile
//	 * @throws IOException
//	 */
//	public void downLoad(HttpServletRequest request, HttpServletResponse response, String outFileName, String contentType, String inputFilePath) throws IOException;

}
